﻿using System;
using System.Windows.Forms;
using MySql.Data.MySqlClient;
namespace CDIO
{
    namespace DB
    {
        /*
         * CDIODAO类使用说明：
         * 1、首先生成对象，调用构造函数；
         * 可以根据需要设置数据库连接URL；
         * 设置完毕后就可以调用GetConnection方法；
         * 2、该方法中已经做了相应的异常捕获和处理，
         * 如果不能连接到数据库就会给出错误提示，
         * 并退出程序。
         * 3、不使用数据库连接时并不需要显示调用
         * closeConnection方法，因为在析构函数
         * 中会自动调用，在该对象生命周期结束后
         * 就会自动释放该连接。
         * 4、该类的doQuery方法只接受一个包含sql语句
         * 的字符串，并且会判断语句的有效性（只包
         * 括是否为空的最简单验证，不验证语法正确
         * 性），返回值为一个MySqlDataReader对象，
         * 可以使用该对象获取查询到的结果。
         */
        public class DAO
        {
            private string dataBaseServer = "server=localhost;";
            private string serverPort = "port=3306;";
            private string databaseName = "database=schoolcard;";
            private string userName = "user=card;";
            private string password = "password=card;";
            private MySqlConnection conn;

            public DAO(bool AutoConnect = true)
            {
                if (AutoConnect)
                {
                    getConnection();
                } 
                else
                {
                    conn = null;
                }
            }
            public string DatabaseServer
            {
                set
                {
                    if (value == null || value.Length == 0)
                        return;
                    dataBaseServer = "server=" + value + ";";
                }
                get
                {
                    int findex = databaseName.LastIndexOf(';');
                    int eqindex = databaseName.IndexOf('=');
                    if (findex > eqindex + 1)
                    {
                        return databaseName.Substring(eqindex + 1, findex - eqindex + 1);
                    }
                    else
                    {
                        return "no server";
                    }
                }
            }

            public int ServerPort
            {
                set
                {
                    if (value > 1023 && value < 65536)
                        serverPort = "port=" + value.ToString() + ";";
                }
                get
                {
                    int bindex = serverPort.IndexOf('=');
                    int eindex = serverPort.LastIndexOf(';');
                    return Convert.ToInt32(serverPort.Substring(bindex + 1, eindex - bindex + 1));
                }
            }
            public string DatabaseName
            {
                set
                {
                    if (value == null || value.Length == 0)
                        return;
                    databaseName = "database=" + value + ";";
                }
                get
                {
                    int bindex = databaseName.IndexOf('=');
                    int eindex = databaseName.LastIndexOf(';');
                    return databaseName.Substring(bindex + 1, eindex - bindex + 1);
                }
            }
            public string UserName
            {
                set
                {
                    if (userName == null || userName.Length == 0)
                        return;
                    userName = "user=" + userName + ";";
                }
                get
                {
                    int bindex = userName.IndexOf('=');
                    int eindex = userName.LastIndexOf(';');
                    return userName.Substring(bindex + 1, eindex - bindex + 1);
                }
            }
            public string Password
            {
                set
                {
                    if (value == null || value.Length == 0)
                        return;
                    password = "password=" + value + ";";
                }
                get
                {
                    int bindex = password.IndexOf('=');
                    int eindex = password.LastIndexOf(';');
                    return password.Substring(bindex + 1, eindex - bindex + 1);
                }
            }
            public bool getConnection()
            {
                try
                {
                    conn = new MySqlConnection(dataBaseServer + serverPort + databaseName + userName + password);
                    conn.Open();
                }
                catch (MySqlException e)
                {
                    MessageBox.Show(e.Source + " : " + e.Message);
                    Application.Exit();
                    return false;
                }
                return true;
            }
            ~DAO()
            {
                closeConnection();
            }
            public object Excute(string sql,bool update = false)
            {
                if (sql == null || sql.Length == 0)
                {
                    MessageBox.Show("sql语句不能为空");
                    return null;
                }
                if (conn == null)
                {
                    MessageBox.Show("未连接数据库");
                    return null;
                }
                try
                {
                    MySqlCommand cmd = new MySqlCommand(sql, conn);
                    MySqlDataReader reader;
                    if (update)
                    {
                        return cmd.ExecuteNonQuery();
                    }
                    else
                    {
                        reader = cmd.ExecuteReader();
                        return reader;
                    }
                }
                catch (MySqlException e)
                {
                    MessageBox.Show(e.Source+e.Message);
                    return null;
                }
            }


            private void closeConnection()
            {
                if (conn != null)
                {
                    conn.Close();
                }
            }
        }
    }
}